package com.eighth.singleton;

/**
 * 单例模式之懒汉式
 * 实现：
 * 1、定义一个私有构造方法
 * 2、提供一个本类的对象的引用（静态）
 * 3、提供一个获取本类对象的引用的方法
 * 特点：生命周期短，占用内存时间短，第一次调用效率低（懒加载）
 * 通常我们会在项目中采用懒汉式实现方案，就是在什么时候用，什么时候创建，缩短对象的生命周期
 * 那在什么情况下要用单例模式：
 * 在项目中的一些工具类的使用时，通常用单例
 * 1、工具类中，只有方法，没有属性（属性是跟对象相关）
 * 2、会被频繁使用
 * 目的是为了节省频繁的创建对象而对内存的消耗，从而提高效率
 * 创建对象也会消耗性能
 * 在此模式下，会线程安全问题
 * 当 A 线程调用getInstance(）在执行完instance==null的判断后时间片用完，然后 B线程调用getInstance(）
 * 由于 A 还未创建instance对象，所以 B 线程判断instance也为空，也会创建对象，所以两线程都会创建对象，
 * 这个就叫做线程不安全（非单例）
 * 我们解决方案是：使用同步方法可以解决这个问题，但是在对象创建完毕后每次调用方法都会同步，会大大降低性能
 * volatile, 在多线程开发中，用于同步变量的状态
 * 此单例模式的实现方案，是完美的实现（面试中你需要提供这个实现方案）
 */
public class Singleton2 {
    // 声明、分配内存，赋值
    private volatile static Singleton2 instance;

    private Singleton2() {
    }

    static Singleton2 getInstance() {
        if (instance == null) {
            synchronized (Singleton2.class) {
                if (instance == null) {
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }

    void print() {
        System.out.println("懒汉式单例测试");
    }

    void save(int data) {
        System.out.println("把数据存储到文件中" + data);
    }
}
